package reflection;

import reflection.bean.User;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class ReflectionTest {

    public static void main(String[] args) {
        // 第一种 通过对象去获取 多此一举
        User user = new User();
        Class<? extends User> clazz = user.getClass();
        // 第二种 通过类去获取
        Class<? extends User> clazz2 = User.class;
        // 第三种 通过全类名去获取
        try {
            Class<?> clazz3 = Class.forName("reflection.bean.User");
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }

        // 第四种 使用类加载器
        ClassLoader classLoader = User.class.getClassLoader();
        try {
            Class<?> clazz4 = classLoader.loadClass("reflection.bean.User");
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }

    void setAttr() throws Exception {
        // 正常赋值
        User user = new User();
        user.setAge(3);
        System.out.println("正常赋值：" + user.getAge());


        // 反射赋值
        // 获取类的 Class 对象实例
        Class<?> clazz = Class.forName("reflection.bean.User");
        // 根据 Class 对象实例获取 Constructor 对象
        Constructor<?> constructor = clazz.getConstructor();
        // 使用 Constructor 对象的 newInstance 方法获取反射类对象
        Object obj = constructor.newInstance();
        // 获取方法的 Method 对象，并且利用 invoke 方法调用方法
        Method setAge = clazz.getDeclaredMethod("setAge", Integer.class);
        setAge.invoke(obj, 1);

        Method getAge = clazz.getDeclaredMethod("getAge");
        System.out.println("反射赋值：" + getAge.invoke(obj));

    }


}
